<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Pro Git - 简体中文版
</title>
    <meta content="http://www.w3.org/1999/xhtml; charset=utf-8" http-equiv="Content-Type"/>
    <link href="stylesheet.css" type="text/css" rel="stylesheet"/>
    <style type="text/css">
		@page { margin-bottom: 5.000000pt; margin-top: 5.000000pt; }</style>
  </head>
  <body class="calibre">
<h2 id="calibre_toc_36" class="calibre3">公共访问</h2>

<p class="calibre2">匿名的读取权限该怎么实现呢？也许除了内部私有的项目之外，你还需要托管一些开源项目。抑或你使用一些自动化的服务器来进行编译，或者一些经常变化的服务器群组，而又不想整天生成新的 SSH 密钥——总之，你需要简单的匿名读取权限。</p>

<p class="calibre2">或许对小型的配置来说最简单的办法就是运行一个静态 web 服务，把它的根目录设定为 Git 仓库所在的位置，然后开启本章第一节提到的 <code class="calibre9">post-update</code> 挂钩。这里继续使用之前的例子。假设仓库处于 <code class="calibre9">/opt/git</code> 目录，主机上运行着 Apache 服务。重申一下，任何 web 服务程序都可以达到相同效果；作为范例，我们将用一些基本的 Apache 设定来展示大体需要的步骤。</p>

<p class="calibre2">首先，开启挂钩：</p>

<pre class="calibre8"><code class="calibre9">$ cd project.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update
</code></pre>

<p class="calibre2">假如使用的 Git 版本小于 1.6，那 <code class="calibre9">mv</code> 命令可以省略—— Git 是从较晚的版本才开始在挂钩实例的结尾添加 .sample 后缀名的。</p>

<p class="calibre2"><code class="calibre9">post-update</code> 挂钩是做什么的呢？其内容大致如下：</p>

<pre class="calibre8"><code class="calibre9">$ cat .git/hooks/post-update 
#!/bin/sh
exec git-update-server-info
</code></pre>

<p class="calibre2">意思是当通过 SSH 向服务器推送时，Git 将运行这个命令来更新 HTTP 获取所需的文件。</p>

<p class="calibre2">其次，在 Apache 配置文件中添加一个 VirtualHost 条目，把根文件（译注： DocumentRoot 参数）设定为 Git 项目的根目录。假定 DNS 服务已经配置好，会把 <code class="calibre9">.gitserver</code> 发送到任何你所在的主机来运行这些：</p>

<pre class="calibre8"><code class="calibre9">&lt;VirtualHost *:80&gt;
    ServerName git.gitserver
    DocumentRoot /opt/git
    &lt;Directory /opt/git/&gt;
        Order allow, deny
        allow from all
    &lt;/Directory&gt;
&lt;/VirtualHost&gt;
</code></pre>

<p class="calibre2">另外，需要把 <code class="calibre9">/opt/git</code> 目录的 Unix 用户组设定为 <code class="calibre9">www-data</code> ，这样 web 服务才可以读取仓库内容，因为 Apache 运行 CGI 脚本的模块（默认）使用的是该用户：</p>

<pre class="calibre8"><code class="calibre9">$ chgrp -R www-data /opt/git
</code></pre>

<p class="calibre2">重启 Apache 之后，就可以通过项目的 URL 来克隆该目录下的仓库了。</p>

<pre class="calibre8"><code class="calibre9">$ git clone http://git.gitserver/project.git
</code></pre>

<p class="calibre2">这一招可以让你在几分钟内为相当数量的用户架设好基于 HTTP 的读取权限。另一个提供非授权访问的简单方法是开启一个 Git 守护进程，不过这将要求该进程的常驻——下一节将是想走这条路的人准备的。</p>

</body>
</html>
